/*
* @file    : Can.h
* @author  : Martin
* @brief   : xxx module Header file
*/
#ifndef DRIVERS_CAN_CAN_H_
#define DRIVERS_CAN_CAN_H_

/*******************************************************************************
**                          Revision Control History                          **
********************************************************************************
Version   Date         User                Comment
********************************************************************************
    0.1   2019-01-01   Martin             - Initial Draft of Can module
*******************************************************************************/
/*==============================================================================
=======                             INCLUDES                             =======
==============================================================================*/
#include <stdint.h>
#include "S32K144.h"
/*==============================================================================
=======               DEFINES & MACROS FOR GENERAL PURPOSE               =======
==============================================================================*/
/*==============================================================================
=======                        CONSTANTS & TYPES                         =======
==============================================================================*/

typedef struct
{
	uint32_t id;
	uint32_t dlc;
	uint8_t data[8];
	uint32_t timestamp;
}CAN_StdFrame, *CAN_StdFramePtr;

/*==============================================================================
=======                             EXPORTS                              =======
==============================================================================*/
/*==============================================================================
=======                  PROTOTYPES OF PUBLIC FUNCTIONS                  =======
==============================================================================*/
extern uint8_t canData[8];

static inline void CAN_DisableModule(CAN_Type* canType)
{
	canType->MCR |= CAN_MCR_MDIS_MASK;
}

static inline void CAN_EnableModule(CAN_Type* canType)
{
	canType->MCR &= ~CAN_MCR_MDIS_MASK;
}

static inline uint8_t CAN_GetMBCODE(uint32_t *pMB)
{
	return (uint8_t)(((*pMB) >> 24u) & 0xF);
}

static inline uint8_t CAN_GetMBDLC(uint32_t *pMB)
{
	return (uint8_t)(((*pMB) >> 16u) & 0xF);
}

static inline void CAN_EnableFreezeMode(CAN_Type* canType)
{
	canType->MCR |= CAN_MCR_FRZ_MASK;
}

static inline void CAN_DisableFreezeMode(CAN_Type *canType)
{
	canType->MCR &= ~CAN_MCR_FRZ_MASK;
}

void Can0_Init();
void Can0_Tx(uint32_t id, uint8_t *pData, uint8_t length);
void Can0_Rx();


#endif /* DRIVERS_CAN_CAN_H_ */
